package com.demo.mapper;


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.demo.entity.Vo.*;
import com.demo.entity.VtePreventive;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.springframework.stereotype.Repository;

import java.util.Date;
import java.util.List;

/**
 * vte诊断评估表 Mapper 接口
 *
 * @author zm
 * @since 2020-12
 */
@Repository
public interface VtePreventiveMapper extends BaseMapper<VtePreventive> {

    /**
     * 查询VTE诊断评估
     *
     * @param pageNumber
     * @param pageSize
     * @param vtePreventiveId
     * @param patientId
     * @return
     */
    List<VtePreventiveVo> getVtePreventive(@Param("pageNumber") Integer pageNumber, @Param("pageSize") Integer pageSize, @Param("vtePreventiveId") Integer vtePreventiveId, @Param("patientId") Integer patientId);

    /**
     * 获取总条数
     *
     * @return
     */
    Integer getCountVtePreventive();

    /**
     * 获取每个评估时机的总评估人数
     * @param startTime         月份开始时间
     * @param endTime          月份最后一天时间
     * @param departments       患者科室集合
     * @param patientId         患者ID结婚
     * @return
     *//*
    List<VtePreventiveRatioVo> getOpportunityAndAssessSum(@Param("startTime") Date startTime,
                                                          @Param("endTime") Date endTime,
                                                          @Param("departments") List<Integer> departments,
                                                          @Param("patientId") List<Integer> patientId);*/


    /**
     * 获取每个评估时机的总评估人数
     *
     * @param startTime   月份开始时间
     * @param endTime     月份最后一天时间
     * @param departments 患者科室集合
     * @param patientId   患者ID结婚
     * @return
     */
    List<VtePreventiveRatioVo> getOpportunityAndAssessSum2(@Param("startTime") Date startTime,
                                                           @Param("endTime") Date endTime,
                                                           @Param("departments") List<Integer> departments,
                                                           @Param("patientId") Integer patientId);


    /**
     * 获取每个评估时机的总评估人数
     *
     * @param startTime   月份开始时间
     * @param endTime     月份最后一天时间
     * @param departments 患者科室集合
     * @return
     */
    List<Integer> getOpportunityAndAssessSum3(@Param("startTime") Date startTime,
                                              @Param("endTime") Date endTime,
                                              @Param("departments") List<Integer> departments);

    /**
     * 通过患者表中的所有高危患者ID，去vte评估表中，获取这些患者那些做了预防措施评估
     *
     * @param patientId
     * @return
     */
    List<Integer> getHightPatientSumVte(@Param("startTime") Date startTime,
                                        @Param("endTime") Date endTime, @Param("patientId") List<Integer> patientId);

    /**
     * 获取vte评估表中，内科高危患者总数
     *
     * @param startTime
     * @param endTime
     * @return
     */
    List<Integer> getSumHightPadua(@Param("startTime") Date startTime,
                                   @Param("endTime") Date endTime);

    /**
     * 获取vte评估表中，获取为高危的用户
     *
     * @param list 评估ID集合
     * @return
     */
    List<Integer> getSumHightPaduaPhysical(@Param("list") List<Integer> list);

    /**
     * 去重，返回用户ID，多条数据只返回一条【通过vte主键ID，去重查询患者ID】
     *
     * @param list
     * @return
     */
    List<Integer> getSumHightPaduaPhysicalPid(@Param("list") List<Integer> list);

    /**
     * 查询这些用户做了什么预防：物理/药物
     *
     * @param list
     * @return
     */
    List<HeightPrientVo> getDrugAndPhysical(@Param("list") List<Integer> list);


    /**
     * 获取vte评估表中，获取外科中为中/高危患者评估ID
     *
     * @param list 评估ID集合
     * @return
     */
    List<Integer> getSumMiddleAndHightPaduaPhysical(@Param("startTime") Date startTime,
                                                    @Param("endTime") Date endTime, @Param("list") List<Integer> list);

    /**
     * VTE评估为中/高危的患者数【不分内外科】
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteHightMiddle(@Param("startTime") Date startTime,
                                       @Param("endTime") Date endTime,
                                       @Param("list") List<Integer> list,
                                       @Param("departments") List<Integer> departments,
                                       @Param("riskRank") List<Integer> riskRank);

    /**
     * VTE评估为【中+高】危的患者数 且做了禁忌评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteHightMiddleTaboo(@Param("startTime") Date startTime,
                                            @Param("endTime") Date endTime,
                                            @Param("list") List<Integer> list,
                                            @Param("departments") List<Integer> departments);


    /**
     * VTE评估为【中】危的患者数 且做了禁忌评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteMiddleTaboo(@Param("startTime") Date startTime,
                                       @Param("endTime") Date endTime,
                                       @Param("list") List<Integer> list,
                                       @Param("departments") List<Integer> departments);


    /**
     * VTE评估为【高】危的患者数 且做了禁忌评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteHeightTaboo(@Param("startTime") Date startTime,
                                       @Param("endTime") Date endTime,
                                       @Param("list") List<Integer> list,
                                       @Param("departments") List<Integer> departments);


    /**
     * VTE入科评估为中/高危的患者数【不分内外科】
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getFirstSumVteHightMiddle(@Param("startTime") Date startTime,
                                            @Param("endTime") Date endTime,
                                            @Param("list") List<Integer> list,
                                            @Param("departments") List<Integer> departments,
                                            @Param("riskRank") List<Integer> riskRank);


    /**
     * VTE入科评估为【中+高】危的患者数 且做了出院评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteHightMiddleLeaveHospital(@Param("startTime") Date startTime,
                                                    @Param("endTime") Date endTime,
                                                    @Param("list") List<Integer> list,
                                                    @Param("departments") List<Integer> departments);

    /**
     * VTE入科评估为【中】危的患者数 且做了出院评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteMiddleLeaveHospital(@Param("startTime") Date startTime,
                                               @Param("endTime") Date endTime,
                                               @Param("list") List<Integer> list,
                                               @Param("departments") List<Integer> departments);


    /**
     * VTE入科评估为【高】危的患者数 且做了出院评估的人
     *
     * @param startTime
     * @param endTime
     * @param list
     * @return
     */
    List<Integer> getSumVteHeightLeaveHospital(@Param("startTime") Date startTime,
                                               @Param("endTime") Date endTime,
                                               @Param("list") List<Integer> list,
                                               @Param("departments") List<Integer> departments);


    /**
     * 查询内/外科未进行预防措施的人
     *
     * @param patientId
     * @param preventiveType
     * @return
     */
    List<Integer> getPreventionSum(@Param("patientId") List<Integer> patientId, @Param("preventiveType") Integer preventiveType);


    /**
     * 通过患者ID，查询哪些患者做了VTE评估（无论评估时机，只要任何时机做了一次，就算做了，多次去重）
     *
     * @return
     */
    List<Integer> getVteSum(@Param("patientId") List<Integer> patientId);

    /**
     * 通过患者ID，查询哪些患者做了VTE评估且做了预防评估（无论评估时机，只要任何时机做了一次，就算做了，多次去重）
     *
     * @return
     */
    List<Integer> getVtePrventSum(@Param("patientId") List<Integer> patientId);

    /**
     * 查询患者做了VTE评估，且做了物理预防措施
     *
     * @param patientId
     * @return
     */
    List<Integer> getVtePhysical(@Param("patientId") List<Integer> patientId);

    /**
     * 查询患者做了VTE评估，且做了药物预防措施
     *
     * @param patientId
     * @return
     */
    List<Integer> getVteDrug(@Param("patientId") List<Integer> patientId);

    /**
     * 查询患者做了VTE评估，且做了物理+药物预防措施
     *
     * @param patientId
     * @return
     */
    List<Integer> getVtePhysicalAndDrug(@Param("patientId") List<Integer> patientId);


    /**
     * 获取指定时间Vte评估总数量
     *
     * @param startDate
     * @param endDate
     * @return
     */
    List<Integer> getMonthVteSum(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 获取指定时间Vte做了预防措施评估总数量
     *
     * @param startDate
     * @param endDate
     * @return
     */
    List<Integer> getMonthVtePreventSum(@Param("startDate") Date startDate, @Param("endDate") Date endDate);

    /**
     * 根据
     *
     * @param order     升序还是降序
     * @param patientId 患者ID
     * @return
     */
    List<DepartmentRatioVo> getGroupByDepartment(@Param("patientId") List<Integer> patientId, @Param("order") String order);

    /**
     * 获取每个住院患者最后一次评估的时间
     *
     * @param patientId
     * @return
     */
    List<PatientTimeVo> getPatientTime(@Param("patientId") List<Integer> patientId);

    /***
     * 查询此患者危险程度
     * @param patientId
     * @param date
     * @return
     */
    Integer getPatientTimeDeptsn(@Param("patientId") Integer patientId, @Param("maxTime") Date date);

    /**
     * 根据在院患者，计算在院患者做了评估的患者，且各个科室的做了评估的人数
     *
     * @param patientId 患者ID集合
     * @param order
     * @return
     */
    List<DepartmentRatioVo> getRankFivesDepartment(@Param("patientId") List<Integer> patientId, @Param("order") String order);

    /**
     * 根据在院患者，计算在院患者做了评估的患者，且各个科室的做了VTE预防措施评估
     *
     * @param patientId 患者ID集合
     * @param order
     * @return
     */
    List<DepartmentRatioVo> getRankFivesPrevent(@Param("patientId") List<Integer> patientId, @Param("order") String order);

    /**
     * 获取禁忌评估不为空的
     *
     * @param patientId
     * @return
     */
    List<VtePreventive> getTabooAdviseIsNull(@Param("patientId") List<Integer> patientId);


    /**
     * 根据在院患者，计算在院患者做了评估的患者，且各个科室的做了出血风险的评估
     *
     * @param ids   主键ID集合
     * @param order
     * @return
     */
    List<DepartmentRatioVo> getRankFivesBleeding(@Param("ids") List<Integer> ids, @Param("order") String order);


    /**
     * 根据话只能和获取患者最后一次评估的信息
     *
     * @param patientId
     * @return
     */
    VtePreventive getPatientLastTime(@Param("patientId") Integer patientId);

    /**
     * 通过患者id，判断此患者是否做过评估
     *
     * @param patientId
     * @return
     */
    List<VtePreventive> getPreventiveByPid(@Param("patientId") Integer patientId);

    /**
     * @return
     */
    VtePreventive getPatientVteDeptSn(@Param("patientId") Integer patientId);

    /**
     * 预防措施实施指标统计分析 - 分母
     * @param departments           部门列表
     * @param startTime             开始时间
     * @param endTime               结束时间
     * @param preventiveType        诊断类别 1Caprini(外科)2Padua(内科)
     * @param isPrevention          是否预防 0-没有预防；1-有预防
     * @param preventiveRiskRank    风险评估分层：Caprini 1.低危 2.高危   3.中危   4.极低；Padua 1.低危  2.高危
     * @param drugPrevention        是否药物预防 0-否，1. 是
     * @return
     */
    Integer getSumByVtePreventive(@Param("departments") List<Integer> departments,
                                  @Param("startTime") Date startTime,
                                  @Param("endTime") Date endTime,
                                  @Param("preventiveType") Integer preventiveType,
                                  @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                  @Param("isPrevention") Integer isPrevention,
                                  @Param("drugPrevention") Integer drugPrevention,
                                  @Param("physicalPrevention") Integer physicalPrevention);

    /**
     * 预防措施实施指标统计分析 - 分子，与分母的区别就是含有有效防治医嘱
     * @param departments           部门列表
     * @param startTime             开始时间
     * @param endTime               结束时间
     * @param preventiveType        诊断类别 1Caprini(外科)2Padua(内科)
     * @param isPrevention          是否预防 0-没有预防；1-有预防
     * @param preventiveRiskRank    风险评估分层：Caprini 1.低危 2.高危   3.中危   4.极低；Padua 1.低危  2.高危
     * @param drugPrevention        是否药物预防 0-否，1. 是
     * @return
     */
    Integer getSumByVtePreventiveAndDoctorAdvice(@Param("departments") List<Integer> departments,
                                  @Param("startTime") Date startTime,
                                  @Param("endTime") Date endTime,
                                  @Param("preventiveType") Integer preventiveType,
                                  @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                  @Param("isPrevention") Integer isPrevention,
                                  @Param("drugPrevention") Integer drugPrevention,
                                  @Param("physicalPrevention") Integer physicalPrevention);

    Integer getSumByVtePreventiveDischargeSummary(@Param("departments") List<Integer> departments,
                                                  @Param("deptType") Integer deptType,
                                                  @Param("startTime") Date startTime,
                                                  @Param("endTime") Date endTime,
                                                  @Param("preventiveType") Integer preventiveType,
                                                  @Param("preventiveriskRank") Integer[] preventiveriskRank,
                                                  @Param("drugPrevention") Integer drugPrevention,
                                                  @Param("physicalPrevention") Integer physicalPrevention,
                                                  @Param("dischargeWhereabouts") Integer dischargeWhereabouts,
                                                  @Param("diagnoseOpportunity") Integer diagnoseOpportunity);

    /**
     * 风险评估实施指标---VTE中高危患者出血风险评估率(确认)
     * @param departments
     * @param preventiveRiskRank
     * @param startTime
     * @param endTime
     * @return
     */
    Integer getSumByVtePreventiveConfirm(@Param("departments") List<Integer> departments,
                                         @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                         @Param("startTime") Date startTime,
                                         @Param("endTime") Date endTime);

    /**
     * 风险评估实施指标---VTE中高危患者出血风险评估率(签字)
     * @param departments
     * @param preventiveRiskRank
     * @param startTime
     * @param endTime
     * @return
     */
    Integer getSumByVtePreventiveSign(@Param("departments") List<Integer> departments,
                                      @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                      @Param("startTime") Date startTime,
                                      @Param("endTime") Date endTime);

    Integer getSumByVtePreventiveFlow(@Param("departments") List<Integer> paramList,
                                      @Param("startTime") Date paramDate1,
                                      @Param("endTime") Date paramDate2,
                                      @Param("diagnoseOpportunity") Integer paramInteger);

    Integer getVteSumByDeptSn(@Param("deptSn") Integer paramInteger, @Param("highRiskRank") Integer[] paramArrayOfInteger);

    List<DepartmentVo> getVteDeptSnRanking(@Param("orderType") String paramString, @Param("topNumber") Integer paramInteger);

    List<DepartmentVo> getVteBleedDeptSnRanking(@Param("orderType") String paramString, @Param("topNumber") Integer paramInteger);

    /**
     * 风险评估实施指标-VTE风险出院再评估率
     * @param departments           部门列表
     * @param startTime             开始时间
     * @param endTime               结束时间
     * @param preventiveType        诊断类别 1Caprini(外科)2Padua(内科)
     * @param preventiveRiskRank    风险评估分层：Caprini 1.低危 2.高危   3.中危   4.极低；Padua 1.低危  2.高危
     * @param dischargeWhereabouts        是否药物预防 0-否，1. 是
     * @return
     */
    Integer getSumByFirstRiskVtePreventiveRank(@Param("departments") List<Integer> departments,
                                               @Param("startTime") Date startTime,
                                               @Param("endTime") Date endTime,
                                               @Param("preventiveType") Integer preventiveType,
                                               @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                               @Param("dischargeWhereabouts") Integer[] dischargeWhereabouts);

    /**
     * 风险评估实施指标-VTE风险出院再评估率
     * @param departments           部门列表
     * @param startTime             开始时间
     * @param endTime               结束时间
     * @param preventiveType        诊断类别 1Caprini(外科)2Padua(内科)
     * @param preventiveRiskRank    风险评估分层：Caprini 1.低危 2.高危   3.中危   4.极低；Padua 1.低危  2.高危
     * @param dischargeWhereabouts  是否药物预防 0-否，1. 是
     * @return
     */
    Integer getSumByFirstRiskVtePreventiveRankReVte(@Param("departments") List<Integer> departments,
                                                    @Param("startTime") Date startTime,
                                                    @Param("endTime") Date endTime,
                                                    @Param("preventiveType") Integer preventiveType,
                                                    @Param("preventiveRiskRank") Integer[] preventiveRiskRank,
                                                    @Param("dischargeWhereabouts") Integer[] dischargeWhereabouts);

    List<MessageSocketVo> getVtePreventiveIntervalDay(@Param("lowRiskRank") Integer[] lowRiskRank,
                                                      @Param("lowIntervalDay") Integer lowIntervalDay,
                                                      @Param("middleRiskRank") Integer[] middleRiskRank,
                                                      @Param("middleIntervalDay") Integer middleIntervalDay,
                                                      @Param("highRiskRank") Integer[] highRiskRank,
                                                      @Param("highIntervalDay") Integer highIntervalDay);

    @Select("select patient_id, max(vte_preventive_id) as vte_preventive_id from pd_vte_preventive where deleted_time is null and risk_confirm_time is not null group by patient_id")
    List<VtePreventive> queryRecentVtePreventive();

    @Select("select patient_id, vte_preventive_id from pd_vte_preventive where deleted_time is null and risk_confirm_time is not null and patient_id=#{patientId} order by risk_confirm_time desc limit 1")
    VtePreventive queryRecentVtePreventiveByPatientId(@Param("patientId") Integer patientId);
}
